# 元数据子系统

元数据子系统是一个以内存为中心的分布式数据结构，是由一个或多个元数据分片组成。

元数据子系统数据使用Multi-Raft来充分使用服务器资源和保障数据高可用及强一致性，可以很方便的迁移资源，并通过分裂实现横向扩展。

## 元数据内部设计

每个元数据可以包含成百上千的元数据分片，每个分片由`InodeTree（BTree）`和`DentryTree（BTree）`组成。

每个`inode`代表文件系统中的一个文件或目录， 每个`dentry`代表一个目录项，`dentry`由`parentId`和`name`组成。

- 在`DentryTree`中，以`ParentId`和`name`组成索引，进行存储和检索
- 在`InodeTree`中，则以`inode id`进行索引。
- 使用multiRaft协议保障高可用性和数据一致性复制，且每个节点集合会包含大量的分片组，每个分片组对应一个`raft group`。
- 每个分片组隶属于某个volume，分片组都是某个volume的一段元数据范围（`inode id`范围`[100-20000)` )
- 元数据子系统通过分裂来完成动态扩容
- 当一分片组的性能（包含如下指标：内存）紧接临近值时，资源管理器服务会预估一个结束点，并通知此组节点设备，只服务到此点之前的数据，同时也会新选出一组节点，并动态加入到当前业务系统中，新节点组其实点刚好是上个节点组的结束点位置。

## 复制

元数据更新的复制是以元数据分片为单位的。复制强一致性是通过Raft改良版本，MultiRaft来实现的。MultiRaft减少了心跳通信的负担。

## 故障恢复

内存元数据分片通过快照的方式持久化到磁盘以作备份和恢复使用，日志压缩技术被用来减小日志文件大小和恢复时间。

值得一提的是，元数据操作有可能会导致孤儿inode，即只有inode但是没有对应的dentry。为了减少这种情况的发生，
- 首先，元数据节点通过Raft保证高可用，单点故障后可以迅速恢复
- 其次，客户端保证在一定时间内进行重试

## 更多详情
更多详情请查看[CubeFS存储技术揭秘|元数据设计](/zh/blog/technicalInsights/Secret_of_CubeFS_Technology_Metadata_Subsystem_Design.html)